Visualización de datos con ggplot2

![](ggplot2.png)

Es importante que en un informe académico se incorpore visualización de datos, pues muchas veces resulta una representación más eficiente de los análisis en comparación con textos y tablas. A continuación, introduciremos algunos tópicos básicos y avanzados en visualización de datos con ggplot2. Utilizaremos como ejemplo los datos del Estudio Longitudinal Social de Chile (ELSOC, 2016).

#Instalamos los paquetes que necesitaremos
#install.packages("ggplot2") #Gráficos
library(ggplot2)
library(haven)
#Leemos el conjunto de datos.
load(url("https://juancarloscastillo.github.io/metsoc-facsouchile/documents/data/ELSOC_W01_v2.00.RData"))
n
## function () 
## {
##     from_context("..group_size")
## }
## <bytecode: 0x330ea28>
## <environment: namespace:dplyr>
#Establecemos los casos perdidos a variables de interés.
elsoc_w01[elsoc_w01==-999 | elsoc_w01==-888] <- NA

Una vez cargado el conjunto de datos y asignado los casos perdidos, podemos comenzar realizar diferentes tipos de visualizaciones de datos.

#Grafico de barras para la variabla horas habituales por tramos
ggplot(elsoc_w01, aes(x = as.factor(d05_01))) +
  geom_bar(width = 0.4, fill=rgb(0.1,0.3,0.5,0.7) ,aes(y = (..count..)/sum(..count..))) +
  scale_x_discrete("Provenir de familia adinerada",
                   labels = c("Nada importante",
                              "Poco importante",
                              "Algo importante",
                              "Bastante importante",
                              "Muy importante"), na.translate = FALSE) +
  scale_y_continuous("Frecuencia porcentual",labels=scales::percent ) +
  labs(title = "Gráfico de barras",
       subtitle = "¿Qué tan importante es provenir de una familia adinerada?")

ggplot(data = elsoc_w01, aes(x = c33, y = d05_03)) +
  geom_jitter(size = 1, color = 'blue', alpha = 0.4) +
  geom_violin(aes(fill = d05_01), color = 'black', alpha = 0.8) +
  xlab('Identificación clase social subjetiva') +
  ylab('Importacia atribuida a la ambición') +
  ggtitle('Dispersión bivariada de datos: clase social subjetiva y ambición') +
  theme_minimal()

ggplot(elsoc_w01, aes(x = as.numeric(m0_edad))) +
  geom_density(color="black") +
  stat_function(fun = dnorm,
                args = with(elsoc_w01, c(mean = mean(m0_edad, na.rm=T), sd = sd(m0_edad, na.rm=T))), color = "red")+
  scale_y_continuous("Densidad") +
  labs(title = "Histograma",
       subtitle = "Edad")

-Gráfico de mosaico

Para quienes deban aplicar un modelo de regresión logística binaria (RLB), recomendamos utilizar los gráficos de mosaico para visualizar descriptivamente las variables categóricas.

load("../../data/titanic.Rdata")

pacman::p_load(sjmisc, descr,tidyverse, scales, xtable, ggmosaic, stargazer)
ggplot(data = tt) +
  geom_mosaic(aes(x = product(sex), fill=survived)) +
  theme(legend.position="none", text = element_text(size = 25),axis.title=element_blank())

Finalmente, podemos realizar gráficos dinámicos. Usando los datos del paquete gapminder, construiremos un gráfico animado que incluya la expectativa de vida de los diferentes países y PIB per cápita en el transcurso de los años (gráfico con tres variables interactuando).

#Instalar y cargar paquetes

# devtools::install_github("r-rust/gifski") # esta se instala desde devtools; en linux requiere también instalar cargo (sudo apt-get install cargo)
pacman::p_load(gifski,gapminder,gganimate,dygraphs,png)

# Creditos en GitHub a Thomasp85
# https://gist.github.com/thomasp85/05169ad44ddcc8ed56da6ff7bf7fbe36

dato<-gapminder
ggplot(gapminder, aes(gdpPercap, lifeExp, size = pop, colour = country)) +
  geom_point(alpha = 0.7, show.legend = FALSE) +
  scale_colour_manual(values = country_colors) +
  scale_size(range = c(2, 12)) +
  scale_x_log10() +
  facet_wrap(~continent) +
  # Acá con gganimate especificamos el gif
  labs(title = 'Year: {frame_time}', x = 'GDP per capita', y = 'life expectancy') +
  transition_time(year) +
  ease_aes('linear')
## 
Frame 1 (1%)
Frame 2 (2%)
Frame 3 (3%)
Frame 4 (4%)
Frame 5 (5%)
Frame 6 (6%)
Frame 7 (7%)
Frame 8 (8%)
Frame 9 (9%)
Frame 10 (10%)
Frame 11 (11%)
Frame 12 (12%)
Frame 13 (13%)
Frame 14 (14%)
Frame 15 (15%)
Frame 16 (16%)
Frame 17 (17%)
Frame 18 (18%)
Frame 19 (19%)
Frame 20 (20%)
Frame 21 (21%)
Frame 22 (22%)
Frame 23 (23%)
Frame 24 (24%)
Frame 25 (25%)
Frame 26 (26%)
Frame 27 (27%)
Frame 28 (28%)
Frame 29 (29%)
Frame 30 (30%)
Frame 31 (31%)
Frame 32 (32%)
Frame 33 (33%)
Frame 34 (34%)
Frame 35 (35%)
Frame 36 (36%)
Frame 37 (37%)
Frame 38 (38%)
Frame 39 (39%)
Frame 40 (40%)
Frame 41 (41%)
Frame 42 (42%)
Frame 43 (43%)
Frame 44 (44%)
Frame 45 (45%)
Frame 46 (46%)
Frame 47 (47%)
Frame 48 (48%)
Frame 49 (49%)
Frame 50 (50%)
Frame 51 (51%)
Frame 52 (52%)
Frame 53 (53%)
Frame 54 (54%)
Frame 55 (55%)
Frame 56 (56%)
Frame 57 (57%)
Frame 58 (58%)
Frame 59 (59%)
Frame 60 (60%)
Frame 61 (61%)
Frame 62 (62%)
Frame 63 (63%)
Frame 64 (64%)
Frame 65 (65%)
Frame 66 (66%)
Frame 67 (67%)
Frame 68 (68%)
Frame 69 (69%)
Frame 70 (70%)
Frame 71 (71%)
Frame 72 (72%)
Frame 73 (73%)
Frame 74 (74%)
Frame 75 (75%)
Frame 76 (76%)
Frame 77 (77%)
Frame 78 (78%)
Frame 79 (79%)
Frame 80 (80%)
Frame 81 (81%)
Frame 82 (82%)
Frame 83 (83%)
Frame 84 (84%)
Frame 85 (85%)
Frame 86 (86%)
Frame 87 (87%)
Frame 88 (88%)
Frame 89 (89%)
Frame 90 (90%)
Frame 91 (91%)
Frame 92 (92%)
Frame 93 (93%)
Frame 94 (94%)
Frame 95 (95%)
Frame 96 (96%)
Frame 97 (97%)
Frame 98 (98%)
Frame 99 (99%)
Frame 100 (100%)
## Finalizing encoding... done!

Tal como se puede observar, tenemos cuatro variables interactuando en el gráfico: a) países (categórica); b) expectativa de vida (intervalar); c) PIB per cápita (intervalar); y d) tiempo en años (intervalar).

-Tabla para reportar un modelo de regresión

El reporte de resultados de los parámetros estimados (e.g., coeficientes B, F de Levene, R2, suma de cuadrados) podemos realizarlo en tablas con este formato y estilo

Primero se realiza un ajuste de las variables:

elsoc_w01[elsoc_w01==-999 | elsoc_w01==-888] <- NA
elsoc_w01$sexo<- as.factor(car::recode(elsoc_w01$m0_sexo, "1='Hombre'; 2='Mujer'"))
elsoc_w01$ed<- as.factor(elsoc_w01$m01)
elsoc_w01$edu<- car::recode(elsoc_w01$ed, "10 ='Universitaria';1:3='Básica'; 4:5='Media'; 6:7='Tecnica Superior'; 8:9 ='Universitaria'")
elsoc_w01$edu<- as.factor(elsoc_w01$edu)

Luego, se estiman los modelos:

modelo1<- lm(d01_01 ~ m0_edad+ m29 +sexo, data=elsoc_w01)
modelo2<- lm(d01_01 ~ m0_edad+ m29 +sexo+edu, data=elsoc_w01)

Finalmente, reporte con la librería texreg

pacman::p_load(texreg)
htmlreg(list(modelo1, modelo2),
        custom.model.names = c("Modelo 1", "Modelo 2"),
        custom.coef.names = c("Intercepto", "Edad", "Ingreso", "Mujer", "Media","Técnica","Universitaria"),   #Cambiar nombre de las variables
        include.f=TRUE,
        include.rmse=FALSE,
        custom.note = "%stars., errores estándar en paréntesis",
        caption=" ",
        #single.row = T, #para que la DS este en una linea
        booktabs = TRUE, dcolumn = TRUE, doctype = FALSE)
Modelo 1 Modelo 2
Intercepto 4.59*** 3.36***
(0.11) (0.14)
Edad -0.00 0.01***
(0.00) (0.00)
Ingreso 0.00* 0.00*
(0.00) (0.00)
Mujer -0.13* -0.07
(0.06) (0.06)
Media 0.60***
(0.08)
Técnica 1.07***
(0.10)
Universitaria 1.37***
(0.10)
R2 0.01 0.08
Adj. R2 0.00 0.08
Num. obs. 2339 2337
F statistic 4.80 35.93
p < 0.001, p < 0.01, p < 0.05., errores estándar en paréntesis